import ast

from spel4llvm.grammar_value_types import TP_INT, TP_FLOAT, TP_STR, TP_BOOL

UNARY_OP_MAPPING = {
    "++": ast.Add(),
    "--": ast.Sub(),
    ("-", TP_INT): "neg",
    ("-", TP_FLOAT): "fneg",
}
BIN_OP_MAPPING = {
    ("+", TP_INT): "add",
    ("-", TP_INT): "sub",
    ("*", TP_INT): "mul",
    ("/", TP_INT): "sdiv",
    ("div", TP_INT): "sdiv",
    ("%", TP_INT): "srem",
    ("mod", TP_INT): "srem",
    ("+", TP_FLOAT): "fadd",
    ("-", TP_FLOAT): "fsub",
    ("*", TP_FLOAT): "fmul",
    ("/", TP_FLOAT): "fdiv",
    ("div", TP_FLOAT): "fdiv",
    ("%", TP_FLOAT): "frem",
    ("mod", TP_FLOAT): "frem",
    ("+", TP_STR): "call#str_concat",
}
CMP_OP_MAPPING = {
    ("==", TP_INT): "icmp_signed#==",
    ("eq", TP_INT): "icmp_signed#==",
    ("!=", TP_INT): "icmp_signed#!=",
    ("ne", TP_INT): "icmp_signed#!=",
    (">", TP_INT): "icmp_signed#>",
    ("gt", TP_INT): "icmp_signed#>",
    (">=", TP_INT): "icmp_signed#>=",
    ("ge", TP_INT): "icmp_signed#>=",
    ("<", TP_INT): "icmp_signed#<",
    ("lt", TP_INT): "icmp_signed#<",
    ("<=", TP_INT): "icmp_signed#<=",
    ("le", TP_INT): "icmp_signed#<=",
    ("==", TP_BOOL): "icmp_signed#==",
    ("eq", TP_BOOL): "icmp_signed#==",
    ("!=", TP_BOOL): "icmp_signed#!=",
    ("ne", TP_BOOL): "icmp_signed#!=",
    ("==", TP_FLOAT): "fcmp_unordered#==",
    ("eq", TP_FLOAT): "fcmp_unordered#==",
    ("!=", TP_FLOAT): "fcmp_unordered#!=",
    ("ne", TP_FLOAT): "fcmp_unordered#!=",
    (">", TP_FLOAT): "fcmp_unordered#>",
    ("gt", TP_FLOAT): "fcmp_unordered#>",
    (">=", TP_FLOAT): "fcmp_unordered#>=",
    ("ge", TP_FLOAT): "fcmp_unordered#>=",
    ("<", TP_FLOAT): "fcmp_unordered#<",
    ("lt", TP_FLOAT): "fcmp_unordered#<",
    ("<=", TP_FLOAT): "fcmp_unordered#<=",
    ("le", TP_FLOAT): "fcmp_unordered#<=",
    ("==", TP_STR): "call#str_eq",
    ("eq", TP_STR): "call#str_eq",
    ("!=", TP_STR): "call#str_ne",
    ("ne", TP_STR): "call#str_ne",
    (">", TP_STR): "call#str_gt",
    ("gt", TP_STR): "call#str_gt",
    (">=", TP_STR): "call#str_ge",
    ("ge", TP_STR): "call#str_ge",
    ("<", TP_STR): "call#str_lt",
    ("lt", TP_STR): "call#str_lt",
    ("<=", TP_STR): "call#str_le",
    ("le", TP_STR): "call#str_le",
}
